Análisis del mercado de Apps móviles

En este Notebook vamos a analizar los datos que hemos obtenido de los datasets originales de las tiendas de Google y Apple.

Recordemos que partíamos de dos datasets:

  • El dataset de Apple tenía unas 770,000 Apps, de las cuales obtuvimos unas 114,000.
  • El dataset de Google tenía unos 2.3 Millones de Apps, de las cuales obtuvimos unas 265,000
  • Tras los procesos de Data Cleaning nos quedamos, respectivamente, con el 14% y con el 11% de las Apps, por lo durante el proceso de filtrado se eliminaron un porcentaje relativamente similar de Apps.

Estas cantidades de datos eliminados pueden parecer muy altas, pero debemos tener en cuenta que todos los datos fueron obtenidos por medio de Web Scraping, y que además establecimos criterios muy específicos para filtrar los datos, de manera que las Apps resultantes fueran comparables a la que queremos lanzar al mercado.

Las Apps que tenemos disponibles cumplen con los siguientes criterios:

  • Son Apps gratuitas
  • Si tenemos información, admiten publicidad
  • Son Apps orientadas a mercados occidentales (si tenemos algunas que no cumplen este requisito, la proporción es mínima)
  • Son Apps relativamente actualizadas
  • No tenemos valores nulos, y carecemos de valores extraños (o si los tenemos, la proporción es mínima)
  • Tenemos fechas de todos los registros

Objetivo

Nuestro principal objetivo será encontrar las categorías mejor valoradas por los usuarios, o que creamos que por algún motivo gozan de popularidad.

No podemos guiarnos únicamente por las valoraciones de los usuarios, porque tenemos que tener en cuenta que no todos los usuarios satisfechos escriben una reseña o valoran su producto. De hecho, existe una tendencia natural a valorar las experiencias negativas, y a no valorar las positivas, por lo que una App con buenas valoraciones la tomaremos como que es excepcional, mientras que una App con valoraciones medias negativas, tendremos que estudiar un poco más a fondo a qué es debido.

También estudiaremos otra serie de variables que podrían ser interesantes para planificar el lanzamiento de la App.

Las fechas podrían ser importantes, es posible que los usuarios tiendan a descargar e instalar más Apps en meses concretos del año, y esto podría ser un dato jugoso para obtener rentabilidad. No tenemos que estudiarlo necesariamente, pero llegado el caso, y si necesitamos un análisis más profundo por falta de información, podremos plantearnos analizar estas variables.

También podemos estudiar qué tipo de Apps son más populares en función del público al que van dirigido, para poder encontrar un hueco muy específico en el mercado.

Podemos también obtener información sobre desarrolladores de Apps para tomarlos como referencia. Por ejemplo, podríamos descubrir que cierto desarrollador que tiene varias Apps en el mercado tiene unas valoraciones medias inferiores a la media total, y sería una buena opción estudiar las Apps de este desarrollador para evitar tomarlo como referencia. Por supuesto, también se podría dar el caso opuesto (desarrolladores muy bien valorados en relación a la media).

Como vemos, existen múltiples casos que podemos estudiar para encontrar las condiciones óptimas de entrada en el mercado. Aunque todo esto son hipótesis, trataremos de que sean los datos los que nos guíen a través del proceso.

Combinación de datasets

Una opción que podría ser interesante sería combinar ambos datasets en uno solo para estudiarlo, pero existen varios inconvenientes:

  • Podrían existir (y de hecho existen) multitud de Apps repetidas en ambas tiendas
  • Varias columnas no existen en el otro dataset, y viceversa. Esto nos obligaría a estar filtrando continuamente, o a crear dos subsets de datos, que es exactamente lo que tenemos ahora.

Por estos dos inconvenientes, hemos preferido mantener los dos datasets por separado, y de hecho puede ser interesante comprobar las diferencias (o lo que sería mejor, las similtudes) de ambas tiendas de forma individual.

Todos los análisis los realizaremos sobre ambos conjuntos de datos, excepto análisis más específicos de ciertas variables que solo se encuentren disponibles en uno de los datasets.


Configuración del entorno de desarrollo

Vamos a realizar las importaciones y a realizar las configuraciones típicas para el Notebook:

In [ ]:
import pandas as pd
import numpy as np
import plotly
plotly.offline.init_notebook_mode()
import seaborn as sns
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
%matplotlib inline


sns.set(color_codes = True)

pd.set_option('display.max_columns', None)
pd.set_option('display.float_format', lambda x: '%.3f' % x)
pd.options.mode.chained_assignment = None

from IPython.core.display import HTML
HTML("""
<style>
.output_png {
    display: table-cell;
    text-align: center;
    margin:auto;
}
.prompt 
    display:none;
}
}
</style>
""")
Out[ ]:

Lectura de los datasets

Vamos a leer los datasets que hemos construido:

In [ ]:
# Leemos ambos datasets con Pandas
apple = pd.read_csv('clean_apple.csv')
google = pd.read_csv('clean_google.csv')
In [ ]:
# Aspecto de los DataFrames
apple.head()
Out[ ]:
app_name developer age_rating total_average_rating total_number_of_ratings release_date last_update price primary_genre all_genres languages
0 arabdict Dictionary Youssef Fouad 4+ 4.500 112.000 2013-10 2019-10 0.000 Education ['Education', 'Books'] ['EN']
1 beautifulBible firebloom media, LLC 4+ 4.500 9.000 2015-08 2017-11 0.000 Reference ['Reference', 'Books'] ['EN']
2 beautifulBook firebloom media, LLC 12+ 5.000 13.000 2015-08 2015-08 0.000 Book ['Books', 'Entertainment'] ['EN']
3 biblia reina valera 1960 Yonlada Nambutdi 4+ 4.500 5.000 2018-11 2018-11 0.000 Book ['Books', 'Education'] ['EN']
4 bookcollage -for bookstagram Takuto Mori 9+ 4.500 10.000 2018-12 2019-01 0.000 Book ['Books', 'Photo & Video'] ['EN']
In [ ]:
google.head()
Out[ ]:
app_name category rating rating_count installs minimum_installs maximum_installs free price currency size developer_id released last_updated age ad_supported in_app_purchases
0 Ampere Battery Info Tools 4.400 64.000 5000.000 5000.000 7662 True 0.000 USD 2.9M Webserveis May-2020 May-2021 Everyone True False
1 Neon 3d Iron Tech Keyboard Theme Personalization 4.700 820.000 50000.000 50000.000 62433 True 0.000 USD 3.5M Free 2021 Themes for Emoji keyboard Sep-2019 Oct-2020 Everyone True False
2 Coloring Book Barbaie Entertainment 3.800 736.000 500000.000 500000.000 646456 True 0.000 USD 20M bisgumah Apr-2019 Nov-2020 Everyone True False
3 Random Number Generator Tools 4.200 35.000 10000.000 10000.000 21124 True 0.000 USD 2.4M GaryG Apps May-2017 May-2020 Everyone True False
4 Photo Brightness Editor - Image Brighten App Photography 2.500 21.000 5000.000 5000.000 8984 True 0.000 XXX 6.2M Anuoluwapo Nov-2020 Nov-2020 Everyone True False

Estandarización de Categorías

Antes de empezar a realizar las visualizaciones, vamos a estandarizar las Categorías de Apps presentes en cada uno de los datasets.

Las distintas Categorías de Apps en cada uno de los datasets son las siguientes:

In [ ]:
# Número de categorías únicas en el dataset de Apple
len(apple.primary_genre.unique())
Out[ ]:
24
In [ ]:
# Categorías de Apps en el dataset de Apple
print(apple.primary_genre.unique())
['Education' 'Reference' 'Book' 'Entertainment' 'Productivity' 'Lifestyle'
 'Utilities' 'Music' 'Health & Fitness' 'Medical' 'Games' 'News'
 'Navigation' 'Finance' 'Photo & Video' 'Travel' 'Shopping' 'Sports'
 'Food & Drink' 'Social Networking' 'Business' 'Weather'
 'Magazines & Newspapers' 'Stickers']
In [ ]:
# Número de categorías únicas en el dataset de Google
len(google.category.unique())
Out[ ]:
48
In [ ]:
# Categorías de Apps en el dataset de Google
print(google.category.unique())
['Tools' 'Personalization' 'Entertainment' 'Photography'
 'Health & Fitness' 'Books & Reference' 'News & Magazines' 'Casual'
 'Art & Design' 'Arcade' 'Card' 'Business' 'Productivity' 'Adventure'
 'Beauty' 'Action' 'Sports' 'Finance' 'Music & Audio' 'Music' 'Social'
 'Education' 'Simulation' 'Video Players & Editors' 'Weather' 'Dating'
 'Board' 'Lifestyle' 'Food & Drink' 'Communication' 'Puzzle'
 'Travel & Local' 'Trivia' 'Casino' 'Maps & Navigation' 'Racing'
 'Educational' 'Auto & Vehicles' 'Medical' 'Strategy' 'Shopping'
 'Role Playing' 'House & Home' 'Parenting' 'Word' 'Libraries & Demo'
 'Comics' 'Events']

Tenemos exactamente el doble de categorías en los datos de Google, lo que dificultaría los análisis y los haría difícil de comprender para el cliente.

Para facilitar los análisis y las visualizaciones, lo que haremos será crear una nueva columna en el dataset de Google, a la que llamaremos subcategory, que será la equivalente a la columna all_genres del dataset de Apple. Esta nueva columna albergará los valores que actualmente tiene la columna category, ya que los valores por defecto de esta columna son en realidad subcategorías. Podemos comprobar esto con la categoría 'Juegos', por ejemplo. En el dataset de Apple, existe una categoría general que engloba todas las Apps de juegos y videojuegos, llamada Games; sin embargo en el dataset de Google existen múltiples categorías de Apps de juegos y videojuegos: Arcade, Adventure, Action, Board, Racing, etc. Esto también ocurre con otras categorías.

Hemos tenido que realizar un análisis manual de todas estas categorías, que no vamos a plasmar aquí para no alargar el Notebook de manera innecesaria. Directamente crearemos la nueva columna subcategory y modificaremos la columna category y realizaremos algunas modificaciones en las Categorías de Apps del dataset de Apple, con el objetivo de que las Categorías principales de las Apps sean las mismas en ambos datasets. Por supuesto, si quisiéramos profundizar en alguna Categoría concreta, siempre tendremos disponible las columnas subcategory en los datos de Google y all_genres en los datos de Apple.

In [ ]:
# Creamos la nueva columna 'subcategory' en el DataFrame de Google
google['subcategory'] = google['category']
In [ ]:
# Estandarizamos las Categorías en ambos DataFrames
google['category'][google.category == 'Communication'] = 'Stickers'
google['category'][google.category == 'Maps & Navigation'] = 'Navigation'
google['category'][google.category == 'Social'] = 'Social Networking'

# Creamos la nueva columna 'subcategory'
google['subcategory'] = google['category']

# Estandarizamos los valores de la columna 'category'
games = ['Casual', 'Arcade', 'Puzzle', 'Simulation', 'Action', 'Adventure', 
          'Trivia', 'Racing', 'Role Playing', 'Board', 'Strategy', 'Card', 
          'Word', 'Auto & Vehicles', 'Casino']
google['category'][google.category.isin(games)] = 'Games'
lifestyle = ['Lifestyle', 'Dating', 'House & Home', 'Parenting']
google['category'][google.category.isin(lifestyle)] = 'Lifestyle'
utilities = ['Tools', 'Personalization']
google['category'][google.category.isin(utilities)] = 'Utilities'
entertainment = ['Entertainment', 'Art & Design']
google['category'][google.category.isin(entertainment)] = 'Entertainment'
education = ['Education', 'Educational']
google['category'][google.category.isin(education)] = 'Education'
photo_video = ['Photography', 'Video Players & Editors']
google['category'][google.category.isin(photo_video)] = 'Photo & Video'
travel = ['Travel & Local', 'Events']
google['category'][google.category.isin(travel)] = 'Travel'
health = ['Health & Fitness', 'Beauty']
google['category'][google.category.isin(health)] = 'Health & Fitness'
music = ['Music', 'Music & Audio']
google['category'][google.category.isin(music)] = 'Music'
books = ['Books & Reference', 'Comics']
google['category'][google.category.isin(books)] = 'Books & Reference'

# Apple
books_ref = ['Book', 'Reference']
apple['primary_genre'][apple.primary_genre.isin(books_ref)] = 'Books & Reference'
news = ['News', 'Magazines & Newspapers']
apple['primary_genre'][apple.primary_genre.isin(news)] = 'News & Magazines'

# Eliminamos la columna 'Libraries & Demo' de Google, por incluir muchas Demos (productos no terminados)
google = google.drop(google[google.category == 'Libraries & Demo'].index)
In [ ]:
# Comprobamos los resultados
print(f'- Número de categorías únicas en la columna "category" (Google): {len(google.category.unique())}')
print(f'- Número de categorías únicas en la columna "subcategory" (Google): {len(google.subcategory.unique())}')
print(f'- Número de categorías únicas en la columna "primary_genre" (Apple): {len(apple.primary_genre.unique())}')
- Número de categorías únicas en la columna "category" (Google): 22
- Número de categorías únicas en la columna "subcategory" (Google): 47
- Número de categorías únicas en la columna "primary_genre" (Apple): 22

Ahora tenemos el mismo número de Categorías principales en ambos DataFrames, y las hemos renombrado para poder realizar comparaciones entre tiendas.

Antes de realizar las conversiones, hemos sido lo más rigurosos y cuidadosos posible, asegurándonos de cada Categoría incluyese las Apps correspondientes en el otro dataset.

Como hemos dicho, no vamos a extendernos sobre estas operaciones, pero queremos dejar constancia de que nos hemos tomado el tiempo necesario antes de realizar los cambios.

Ahora sí podemos empezar a realizar visualizaciones e incluso comparar Categorías entre ambas tiendas.

1. Categorías de Apps y Valoraciones

A lo largo de todo el Notebook, utilizaremos el color azul para representar la Apple App Store y verde para representar la Google Play Store, porque nos ha parecido que puede resultar intuitivo para el cliente, ya que el logo de la tienda de Apple es azul, y el robot del logo de Android es verde.

Vamos a realizar unas cuantas visualizaciones sobre las Categorías de Apps.

Queremos conocer:

  • Cuantas Apps tenemos de cada Categoría
  • Qué Categorías son las mejor valoradas por los usuarios
  • Qué Categorías son las peor valoradas por los usuarios
  • Qué Categorías son las que reciben más feedback por parte de los usuarios
  • Qué Categorías son las que reciben menos feedback por parte de los usuarios
  • Número medio de instalaciones por Categoría

1.1. Número de Apps por categorías

Vamos a mostrar cuantas Apps existen de cada Categoría.

La información que nos aportará este gráfico será cuales son las Categorías con mayor número de Apps en el mercado.

En general, no nos interesará entrar en un mercado que esté muy poblado, más bien lo que nos interesaría sería encontrar un mercado relativamente despoblado pero bien valorado por los usuarios.

In [ ]:
# Creamos dos subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))

# Agregamos los traces
fig.append_trace(go.Bar(x = apple['primary_genre'].value_counts().index, 
                y = apple['primary_genre'].value_counts(), 
                marker_color = 'blue', 
                name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = google['category'].value_counts().index, 
                y = google['category'].value_counts(), 
                marker_color = 'green', 
                name = 'Google Play'), row=2, col=1)

# Giramos los x-axes para una mejor visualización
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)

# Título y tamaño del plot
fig.update_layout(showlegend=False,
                  title_text='Número de Apps totales por Categorías',
                  height=1000, width=800)

fig.show()

En ambos datasets la Categoría Juegos es la más popular.

Llama especialmente la atención que en la App Store triplica la cantidad de la segunda Categoría más popular, Educación, y cuadriplica la de la tercera, Entretenimiento. Esta última también es muy popular en la Google Play Store (tercera Categoría más popular), siendo Utilidades la segunda.

CATEGORÍAS MÁS POPULARES:

  • Apple App Store
      1. Juegos
      1. Educación
      1. Entretenimiento
      1. Finanzas
      1. Negocios
  • Google Play Store
      1. Juegos
      1. Utilidades
      1. Entretenimiento
      1. Música
      1. Educación

CATEGORÍAS MENOS POPULARES:

  • Apple App Store
      1. Salud y Bienestar
      1. Compras
      1. Pegatinas
      1. Navegación
      1. El Tiempo
  • Google Play Store
      1. Negocios
      1. Comida y Bebida
      1. El Tiempo
      1. Navegación
      1. Médico

1.2. Ratings medios por Categoría y Tienda

Vamos a ver los ratings medios por cada Categoría (nota media que han recibido las Apps de los usuarios por Categoría, de 0 a 5).

In [ ]:
# App Store: agrupamos por categoría
valoracion_categoria_apple = apple.groupby('primary_genre').mean()['total_average_rating'].sort_values(ascending=False)
# Google Play Store: agrupamos por categoría
valoracion_categoria_google = google.groupby('category').mean()['rating'].sort_values(ascending=False)

# Dos subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))

# Dos traces
fig.append_trace(go.Bar(x = valoracion_categoria_apple.index, 
                y = valoracion_categoria_apple, 
                marker_color = 'blue', 
                name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = valoracion_categoria_google.index, 
                y = valoracion_categoria_google, 
                marker_color = 'green', 
                name = 'Google Play'), row=2, col=1)

# Giramos los ejes X
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)

# Ajustamos los ejes Y para una mejor visualización
fig.update_yaxes(row=1, col=1, range=[3, 4.1])
fig.update_yaxes(row=2, col=1, range=[3.8, 4.3])

# Título y tamaño del plot
fig.update_layout(showlegend=False,
                  title_text='Valoración Media por Categorías',
                  height=1000, width=800)
fig.show()

Apple App Store: Finanzas, Libros y Negocios, las mejor valoradas en la App Store. Utilidades, Entretenimiento y Pegatinas, las peor valoradas, destacando sobre todo esta última, rozando un rating de 3,2.

Google Play Store: Médico, Música y Educación, las mejor valoradas. Navegación, Entretenimiento y Foto&Vídeo, las peores, con una diferencia pronunciada frente a las demás (estas tres categoriás están especialmente mal valoradas por los usuarios).

1.2.1. Ratings medios por Categoría (ambas tiendas)

Como tenemos las mismas Categorías en ambos DataFrames, podemos juntar las valoraciones medias de cada tienda y ver el rating medio de cada Categoría en ambas tiendas.

In [ ]:
valoracion_categoria_ambos = (valoracion_categoria_apple.sort_index() + 
                             valoracion_categoria_google.sort_index()) / 2
valoracion_categoria_ambos.sort_values(ascending=False)
Out[ ]:
primary_genre
Books & Reference   4.066
Finance             4.058
Medical             4.052
Business            4.019
Shopping            4.008
Social Networking   3.970
Travel              3.968
Music               3.936
Health & Fitness    3.928
Food & Drink        3.925
Weather             3.923
Sports              3.902
Lifestyle           3.901
Productivity        3.875
News & Magazines    3.872
Education           3.863
Games               3.849
Utilities           3.794
Navigation          3.782
Photo & Video       3.755
Entertainment       3.694
Stickers            3.683
dtype: float64
In [ ]:
# Paleta de colores para hacer un efecto degradado
colores = ['#6B080C', '#6B080C', '#6B080C', '#6B080C', '#6B3E0C', '#6B3E0C', '#6B3E0C',
           '#6B560C', '#6B560C', '#6B560C', '#6B760C', '#6B760C', '#6B760C',
           '#6BA10C', '#6BA10C', '#6BA10C', '#6BD00C', '#6BD00C', '#6BD00C',
           '#6BF20C', '#6BF20C', '#6BF20C']

# Figura de Plotly
fig = go.Figure()

# Trace (barras horizontales)
fig.add_trace(go.Bar(
                y = valoracion_categoria_ambos.sort_values(ascending=True).index, 
                x = valoracion_categoria_ambos.sort_values(ascending=True), 
                marker_color = colores, 
                orientation='h'))

# Título, tamaño y adaptación del eje X
fig.update_layout(title='Valoración media por Categoría: ambas tiendas', height=800, width=800)
fig.update_xaxes(range=[3.5, 4.1])
fig.show()

Lo que hemos hecho es sumar los ratings de ambas tiendas y dividirlos entre dos. De esta manera obtenemos un rating medio de ambas tiendas.

CATEGORÍAS CON MEJOR RATING MEDIO:

    1. Libros & Referencia
    1. Finanzas
    1. Médico

CATEGORÍAS CON PEOR RATING MEDIO:

    1. Foto & Vídeo
    1. Entretenimiento
    1. Pegatinas

1.3. Apps más valoradas por Categorías - más de 4,5 de rating

Vamos a filtrar únicamente las Apps cuyo rating sea igual o mayor a 4,5 sobre 5, que según los usuarios son las mejores Apps del mercado.

Mostraremos el número de Apps por Categoría que hay en este grupo:

In [ ]:
# Apple - Apps con más de 4,5* (Categorías)
mas_valoradas_apple = apple[apple.total_average_rating > 4.4]
cat_mas_val_apple = mas_valoradas_apple.groupby('primary_genre')['total_average_rating'].count().sort_values(ascending=False)
# Google - Apps con más de 4,5* (Categorías)
mas_valoradas_google = google[google.rating > 4.4]
cat_mas_val_google = mas_valoradas_google.groupby('category')['rating'].count().sort_values(ascending=False)
In [ ]:
# Hacemos dos subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))

# Dos traces
fig.append_trace(go.Bar(x = cat_mas_val_apple.index, 
                y = cat_mas_val_apple, 
                marker_color = 'blue', 
                name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = cat_mas_val_google.index, 
                y = cat_mas_val_google, 
                marker_color = 'green', 
                name = 'Google Play'), row=2, col=1)

# Configuramos los ejes
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)

# Título y tamaño
fig.update_layout(showlegend=False,
                  title_text="Número de Apps con 4'5* o más - Categorías",
                  height=1000, width=800)
fig.show()

Este gráfico nos muestra la cantidad de Apps que existen por cada Categoría, donde cada App tiene un rating de 4,5 o mayor.

En realidad, la información que nos ofrece no nos aporta valor, ya que hemos visto que efectivamente la Categoría Juegos es la más numerosa en ambos datasets, por lo que tiene sentido que también sea la que más presencia tiene entre las mejor valoradas.

Lo que sí nos puede aportar valor es la cantidad de Apps por Categoría existentes, según el valor esperado o esperanza matemática. Eso es lo que vamos a mostrar a continuación.

1.3.1. Apps más valoradas por Categorías - más de 4'5* - Valor Esperado

In [ ]:
# Apple: porcentaje de Categorías en todo el dataset - VALOR ESPERADO
porc_apple_cat_dataset = apple.primary_genre.value_counts(normalize=True).sort_index()
# Apple: porcentaje de Categorías dentro de las más valoradas (4,5* o más) - VALOR REAL
porc_apple_cat_mas_val = mas_valoradas_apple.primary_genre.value_counts(normalize=True).sort_index()
# Apple: Valor Real Vs. Valor Esperado - Categorías
desempeno_cat_apple = porc_apple_cat_mas_val / porc_apple_cat_dataset
des_apple = (desempeno_cat_apple.sort_values(ascending=False) - 1)*100

# Google: porcentaje de Categorías en todo el dataset - VALOR ESPERADO
porc_google_cat_dataset = google.category.value_counts(normalize=True).sort_index()
# Google: porcentaje de Categorías dentro de las más valoradas (4,5* o más) - VALOR REAL
porc_google_cat_mas_val = mas_valoradas_google.category.value_counts(normalize=True).sort_index()
# Google: Valor Real Vs. Valor Esperado - Categorías
desempeno_cat_google = porc_google_cat_mas_val / porc_google_cat_dataset
des_google = (desempeno_cat_google.sort_values(ascending=False) -1)*100

Sabemos que el código de arriba es tedioso de leer, aunque hemos intentado nombrar a las variables de la manera más intuitiva y legible posible, pero la operación que acabamos de realizar es puro sentido común: el desempeño que hemos calculado arroja un valor que será cero como mínimo (si existiesen cero Apps de una Categoría concreta en el grupo de las más valoradas). Si el número de Apps que existen en este grupo de una Categoría concreta es el mismo que el número de Apps esperadas, la división daría 1 (un número entre sí mismo es 1), por lo que si restamos 1 obtenemos 0, que es el valor esperado (porcentaje de cambio real frente al porcentaje esperado = 0).

Por ejemplo, si tenemos un dataset con 100 Apps, y 40 de ellas son 'Juegos', imaginemos que elegimos las 10 Apps más valoradas: esperaríamos que hubiese 4 juegos (el 10% de 40). Si existen 4 juegos, el porcentaje de cambio es 0% (4/4 -1 100 = 0), mientras que si hay 5 juegos, el porcentaje de cambio es +25% ((5/4 -1) 100 = 25). En este caso, tendríamos una mejora real del 25% (5 Apps) frente al valor esperado (4 Apps).

Si a este resultado le multiplicamos 100, obtenemos porcentajes, que sí que nos aportan valor, porque podremos comprobar cuáles son realmente las Categorías que tienen una presencia mayor de la esperada entre las mejores Apps, y sabremos exactamente en qué proporción a través de los porcentajes que acabamos de calcular.

In [ ]:
# Graficamos los resultados - Valor Real vs Valor Esperado en ambas tiendas
# Con np.where podemos crear una paleta automática de colores en función del valor:
    # Si es positivo será verde, si es negativo será rojo

# Apple
graf_apple = pd.DataFrame(des_apple) 
graf_apple['color'] = np.where(graf_apple < 0, 'red', 'green')
# Google
graf_google = pd.DataFrame(des_google)
graf_google['color'] = np.where(graf_google < 0, 'red', 'green')

# Subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))

# Traces
fig.append_trace(go.Bar(x = graf_apple.index, 
                        y = graf_apple['primary_genre'], 
                        marker_color = graf_apple['color'],
                        name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = graf_google.index, 
                        y = graf_google['category'], 
                        marker_color = graf_google.color, 
                        name = 'Google Play'), row=2, col=1)

# Ejes
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)

# Título, subtítulo y tamaño
fig.update_layout(showlegend=False,
                  title_text="Valor Real Vs. Valor Esperado - Categorías <br><sup>Apps con 4'5* o más - Porcentaje de Categorías (Más es mejor)",
                  height=1000, width=800)
fig.show()

Las Categorías en color verde son las que tienen más Apps entre las más valoradas de las que cabría esperar según su esperanza matemática, y en color rojo las que tienen menos Apps que su esperanza matemática.

En resumen:

APPLE APP STORE:

  • Mejores Categorías según el valor esperado:
      1. Finanzas +24,95%
      1. Shopping +19,98%
      1. Salud y Bienestar +18,67%
  • Peores Categorías según el valor esperado:
      1. Entretenimiento -20,35%
      1. Utilidades -20,7%
      1. Navegación -25,25%

GOOGLE PLAY STORE:

  • Mejores Categorías según el valor esperado:
      1. Médico +27,1%
      1. Música +22,12%
      1. Comida y Bebida +20,21%
  • Peores Categorías según el valor esperado:
      1. Navegación -19,39%
      1. Entretenimiento -23,36%
      1. Foto y Vídeo -42,89%

Categorías a destacar:

  • Las Categorías de tipo Médico, Comida y Bebida, Libros y Referencia y Shopping tuvieron unas valoraciones muy positivas en ambas tiendas.

  • Las Categorías Navegación, Entretenimiento, El Tiempo y Foto y Vídeo tuvieron valoraciones negativas o muy negativas en ambas tiendas.

  • El resto de Categorías tuvieron unas valoraciones rondando su valor esperado entre ambas tiendas, si bien algunas destacaron positivamente como Viajes, o negativamente como Productividad.

Vamos a ver esto de manera más detallada en el siguiente gráfico

1.3.2. Valor Real Vs Valor Esperado por Categorías - Ambas Tiendas (más de 4,5 de rating)

Como tenemos las Categorías homogeneizadas en ambos DataFrames, podemos sumar los resultados de cada Store que hemos obtenido para las Categorías y dividirlos entre dos, de esta manera obtendremos el porcentaje de Valor Real vs Valor Esperado global para todas las Categorías:

In [ ]:
# Apple: ordenamos los índices para sumar entre ambas tiendas
des_apple.sort_index()
Out[ ]:
Books & Reference     9.982
Business              1.248
Education            -5.466
Entertainment       -20.352
Finance              24.960
Food & Drink          8.246
Games                 0.399
Health & Fitness     18.676
Lifestyle             7.039
Medical              16.402
Music                -1.618
Navigation          -25.253
News & Magazines     -8.823
Photo & Video        -8.925
Productivity        -13.398
Shopping             19.988
Social Networking    15.712
Sports                4.798
Stickers              4.887
Travel               11.890
Utilities           -20.706
Weather             -10.304
Name: primary_genre, dtype: float64
In [ ]:
# Google: ordenamos los índices para sumar entre ambas tiendas
des_google.sort_index()
Out[ ]:
Books & Reference    17.170
Business             19.792
Education            18.408
Entertainment       -23.364
Finance              -0.544
Food & Drink         20.219
Games                -8.134
Health & Fitness     -0.395
Lifestyle             1.771
Medical              27.109
Music                22.124
Navigation          -19.391
News & Magazines     -0.799
Photo & Video       -42.895
Productivity         -4.895
Shopping             19.029
Social Networking    17.656
Sports               -9.898
Stickers             -7.802
Travel                6.122
Utilities             3.350
Weather              -6.324
Name: category, dtype: float64
In [ ]:
# Sumamos los valores y dividimos entre dos para obtener la media; después ordenamos de mayor a menor
des_global = (des_apple.sort_index() + des_google.sort_index()) / 2
des_global = des_global.sort_values(ascending=False)
des_global
Out[ ]:
Medical              21.755
Shopping             19.509
Social Networking    16.684
Food & Drink         14.232
Books & Reference    13.576
Finance              12.208
Business             10.520
Music                10.253
Health & Fitness      9.141
Travel                9.006
Education             6.471
Lifestyle             4.405
Stickers             -1.457
Sports               -2.550
Games                -3.868
News & Magazines     -4.811
Weather              -8.314
Utilities            -8.678
Productivity         -9.146
Entertainment       -21.858
Navigation          -22.322
Photo & Video       -25.910
dtype: float64
In [ ]:
# Visualizamos los resultados
# Paleta de colores para hacer un efecto degradado
colores = ['#6BF20C', '#6BF20C', '#6BF20C', '#6BD00C', '#6BD00C', '#6BD00C',
           '#6BA10C', '#6BA10C', '#6BA10C', '#6B760C', '#6B760C', '#6B760C',
           '#6B560C', '#6B560C', '#6B560C', '#6B3E0C', '#6B3E0C', '#6B3E0C',
           '#6B3E0C', '#6B080C', '#6B080C', '#6B080C']

# Figura de Plotly
fig = go.Figure()

# Trace (barras horizontales)
fig.add_trace(go.Bar(
                y = des_global.index, 
                x = des_global, 
                marker_color = colores, 
                orientation='h'))

# Título, tamaño y adaptación del eje X
fig.update_layout(title='Valor Real Vs. Valor Esperado - Categorías (más de 4,5 de rating) <br><sup>Rendimiento total por Categorías en Ambas Stores- Porcentajes (Más es mejor)', height=800, width=800)
fig.show()

Las Categorías Apps que tuvieron más presencia de la esperada entre las mejores fueron:

  • Médico +21,75%
  • Shopping +19,5%
  • Redes Sociales +16,68%
  • Comida y Bebida +14,23%
  • Finanzas +12,2%

Las peores:

  • Foto y Vídeo -25,91%
  • Navegación -22,32%
  • Entretenimiento -21,85%
  • Productividad -9,14%
  • Utilidades -8,67%

1.4. Apps menos valoradas por Categorías - menos de 2,5 de rating

Directamente mostraremos las Categorías de Apps según su valor esperado, ya que —como dijimos— los valores absolutos no nos aportan valor.

In [ ]:
# Apple - Apps con menos de 2,5 de rating (Categorías)
menos_valoradas_apple = apple[apple.total_average_rating < 2.5]
cat_menos_val_apple = menos_valoradas_apple.groupby('primary_genre')['total_average_rating'].count().sort_values(ascending=False)
# Google - Apps con menos de 2,5 de rating (Categorías)
menos_valoradas_google = google[google.rating < 2.5]
cat_menos_val_google = menos_valoradas_google.groupby('category')['rating'].count().sort_values(ascending=False)
In [ ]:
# Apple: porcentaje de Categorías en todo el dataset - VALOR ESPERADO
porc_apple_cat_dataset = apple.primary_genre.value_counts(normalize=True).sort_index()
# Apple: porcentaje de Categorías dentro de las más valoradas (2,5* o más) - VALOR REAL
porc_apple_cat_menos_val = menos_valoradas_apple.primary_genre.value_counts(normalize=True).sort_index()
# Apple: Valor Real Vs. Valor Esperado - Categorías
desempeno_cat_apple_menos_2_stars = porc_apple_cat_menos_val / porc_apple_cat_dataset
des_apple_menos_2_stars = (desempeno_cat_apple_menos_2_stars.sort_values(ascending=True) - 1)*100
In [ ]:
# Google: porcentaje de Categorías en todo el dataset - VALOR ESPERADO
porc_google_cat_dataset = google.category.value_counts(normalize=True).sort_index()
# Google: porcentaje de Categorías dentro de las más valoradas (4,5* o más) - VALOR REAL
porc_google_cat_menos_val = menos_valoradas_google.category.value_counts(normalize=True).sort_index()
# Google: Valor Real Vs. Valor Esperado - Categorías
desempeno_cat_google_menos_2_stars = porc_google_cat_menos_val / porc_google_cat_dataset
des_google_menos_2_stars = (desempeno_cat_google_menos_2_stars.sort_values(ascending=True) -1)*100
In [ ]:
# Graficamos los resultados
# Apple
graf_apple_menos_2_stars = pd.DataFrame(des_apple_menos_2_stars)
graf_apple_menos_2_stars['color'] = np.where(graf_apple_menos_2_stars < 0, 'green', 'red')
# Google
graf_google_menos_2_stars = pd.DataFrame(des_google_menos_2_stars)
graf_google_menos_2_stars['color'] = np.where(graf_google_menos_2_stars < 0, 'green', 'red')

# Subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))

fig.append_trace(go.Bar(x = graf_apple_menos_2_stars.index, 
                        y = graf_apple_menos_2_stars['primary_genre'], 
                        marker_color = graf_apple_menos_2_stars['color'],
                        name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = graf_google_menos_2_stars.index, 
                        y = graf_google_menos_2_stars['category'], 
                        marker_color = graf_google_menos_2_stars.color, 
                        name = 'Google Play'), row=2, col=1)
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)
fig.update_layout(showlegend=False,
                  title_text="Valor Real Vs. Valor Esperado - Categorías <br><sup>Apps con 2'5* o menos - Porcentaje de Categorías (Menos es mejor)",
                  height=1000, width=800)
fig.show()

En este caso, cuantas menos porcentaje de Apps existan entre las peor valoradas por los usuarios (en relación al valor esperado) el resultado es mejor. Por ejemplo, siguiendo con el ejemplo que pusimos anteriormente, si tengo un dataset con 100 Apps, de las cuales 40 son Juegos, y elijo las 20 peor valoradas (20% de Apps totales), esperaríamos que 8 de ellas sean Juegos (20% del total de Juegos). Si en vez de 8 —esperanza matemática— solamente hay 5, eso quiere decir que las Apps de Juegos están mejor valoradas en general que su valor esperado.

En este caso, las Categorías con mejor comportamiento en este sentido fueron:

Mejores y Peores Categorías de Apps en la App Store en relación al valor esperado (menos de 2,5 de rating):

  • Las mejores:
    • Libros y Referencia -47,25%
    • Finanzas -37,13%
    • Médico -18,67%
  • Las peores:
    • Pegatinas +74,27%
    • Entretenimiento +32,77%
    • Utilidades +30,92%

Mejores y Peores Categorías de Apps en la tienda Google Play en relación al valor esperado (menos de 2,5 de rating):

  • Las mejores:
    • El Tiempo -49,5%
    • Médico -48,57%
    • Música -44,12%
  • Las peores:
    • Navegación +104,87%
    • Productividad +62,11%
    • Foto y Vídeo +55,53%

1.4.1. Valor Real Vs Valor Esperado por Categorías - Ambas Tiendas (menos de 2,5 de rating)

En este caso haremos lo mismo que hicimos para las Apps con más de 4,5 de rating en ambas tiendas, para conocer el porcentaje de Apps en el grupo de las peor valoradas según su valor esperado.

En este caso, cuanto menos porcentaje de Apps de una Categoría concreta existan respecto al valor esperado, mejor valoración general habrá obtenido dicha Categoría.

In [ ]:
# Realizamos las operaciones entre ambas tiendas
des_total_menos_2  = (des_apple_menos_2_stars.sort_index() + des_google_menos_2_stars.sort_index()) / 2
des_total_menos_2.sort_values()
Out[ ]:
Medical             -33.624
Books & Reference   -30.414
Weather             -26.268
Music               -26.011
Travel              -13.202
Education            -9.095
Games                -6.018
Shopping             -2.605
Food & Drink          1.994
News & Magazines      2.324
Finance               2.833
Business              4.257
Sports                7.583
Social Networking     8.939
Lifestyle             9.264
Utilities            12.853
Health & Fitness     12.908
Stickers             29.486
Productivity         29.529
Photo & Video        33.578
Entertainment        39.538
Navigation           50.056
dtype: float64
In [ ]:
# Visualizamos los resultados
# Paleta de colores para hacer un efecto degradado
colores = ['#6B080C', '#6B080C', '#6B080C', '#6B080C', '#6B3E0C', '#6B3E0C', '#6B3E0C',
           '#6B560C', '#6B560C', '#6B560C', '#6B760C', '#6B760C', '#6B760C',
           '#6BA10C', '#6BA10C', '#6BA10C', '#6BD00C', '#6BD00C', '#6BD00C',
           '#6BF20C', '#6BF20C', '#6BF20C']

# Figura de Plotly
fig = go.Figure()

# Trace (barras horizontales)
fig.add_trace(go.Bar(
                y = des_total_menos_2.sort_values(ascending=False).index, 
                x = des_total_menos_2.sort_values(ascending=False), 
                marker_color = colores, 
                orientation='h'))

# Título, subtítulo y tamaño 
fig.update_layout(title='Valor Real Vs. Valor Esperado - Categorías (menos de 2,5 de rating) <br><sup>Rendimiento total por Categorías en Ambas Stores- Porcentajes (Menos es mejor)', 
                  height=800, width=800)
fig.show()

Mejores y Peores Categorías respecto al Valor Esperado entre las Apps peor valoradas (menos de 2,5 de rating):

  • Las mejores:

    • Médico -33,62%
    • Libros y Referencia -30,41%
    • El Tiempo -26,26%
  • Las peores:

    • Navegación +50,05%
    • Entretenimiento +39,53%
    • Foto y Vídeo +33,57%

1.5. Categorías y Valoraciones - Conclusiones:

Una vez que hemos analizado a fondo las distintas Categorías, vamos a realizar un resumen de los resultados que hemos obtenido:

1.5.1 Las mejores Categorías (según valoraciones de usuarios)

Categorías con mejor valoración media entre ambas tiendas:

  • Libros y Referencia
  • Finanzas
  • Médico
  • Negocios
  • Shopping

Categorías con más presencia de la esperada entre las mejor valoradas (4,5 de rating o más):

  • Médico
  • Shopping
  • Redes Sociales
  • Comida y Bebida
  • Libros y Referencia

Categorías con menos presencia de la esperada entre las peor valoradas (menos de 2,5 de rating):

  • Médico
  • Libros y Referencia
  • El Tiempo
  • Música
  • Viajes

MEJORES CATEGORÍAS (Global):

Las siguientes Categorías son las que mejores resultados han obtenido:

  • 1. Médico
  • 2. Libros y Referencia
  • 3. Shopping

1.5.2. Las Peores Categorías (según valoraciones de usuarios)

Categorías con peor valoración media entre ambas tiendas:

  • Pegatinas
  • Entretenimiento
  • Foto y Vídeo
  • Navegación
  • Utilidades

Categorías con menos presencia de la esperada entre las mejor valoradas (4,5 de rating o más):

  • Foto y Vídeo
  • Navegación
  • Entretenimiento
  • Productividad
  • Utilidades

Categorías con más presencia de la esperada entre las peor valoradas (menos de 2,5 de rating):

  • Navegación
  • Entretenimiento
  • Foto y Vídeo
  • Productividad
  • Pegatinas

PEORES CATEGORÍAS (Global):

Las siguientes Categorías son las que peores resultados han obtenido:

  • 1. Entretenimiento
  • 2. Foto y Vídeo
  • 3. Navegación

1.6. Categorías - Feedback de los usuarios

Vamos a ver ahora el número de reseñas de los usuarios por Categorías.

En ambos datasets tenemos datos sobre el número de reseñas o valoraciones que tuvo cada App.

Lo que nos interesará conocer es si existen Categorías donde los usuarios tiendan más a dar su opinión o a valorarlas. Sería positivo encontrar aquellas Categorías que tengan una gran cantidad de valoraciones (en relación a su presencia total) y que además estén bien valoradas.

Para calcular esto, necesitamos saber qué proporción ocupa cada Categoría sobre el total de Apps, y después calcular qué proporción ocupan las reseñas totales recibidas por dicha Categoría sobre el total.

Vamos a crear un nuevo dataset que contendrá datos interesantes sobre las reseñas recibidas para cada una de las Categorías:

In [ ]:
# Apple: DataFrame de Categorías y Reseñas
grupos_apple_resenas = apple.groupby('primary_genre').agg({'app_name': 'count', 'total_number_of_ratings': 'sum'})
grupos_apple_resenas['ratings_per_app'] = grupos_apple_resenas['total_number_of_ratings'] / grupos_apple_resenas['app_name']
grupos_apple_resenas['total_ratings'] = 217337260.5
grupos_apple_resenas['rating_pct_total'] = (grupos_apple_resenas['total_number_of_ratings'] / 
                                            grupos_apple_resenas['total_ratings']) * 100
grupos_apple_resenas = grupos_apple_resenas.sort_index()
grupos_apple_resenas['pct_apps_per_category'] = (apple.primary_genre.value_counts(normalize=True)*100).sort_index()
grupos_apple_resenas = grupos_apple_resenas.rename(columns={'app_name': 'num_apps', 
                                    'total_number_of_ratings': 'reseñas_totales_categ', 
                                    'ratings_per_app': 'reseñas_por_app', 
                                    'total_ratings': 'reseñas_totales_data', 
                                    'rating_pct_total': 'porc_reseñas_totales', 
                                    'pct_apps_per_category': 'porc_apps_sobre_total'})
grupos_apple_resenas['variacion_porc_reseñas'] = ((grupos_apple_resenas['porc_reseñas_totales'] / 
                                                 grupos_apple_resenas['porc_apps_sobre_total']) * 100) - 100
grupos_apple_resenas
Out[ ]:
num_apps reseñas_totales_categ reseñas_por_app reseñas_totales_data porc_reseñas_totales porc_apps_sobre_total variacion_porc_reseñas
primary_genre
Books & Reference 3199 3301670.000 1032.094 217337260.500 1.519 2.797 -45.694
Business 8126 3831303.000 471.487 217337260.500 1.763 7.106 -75.192
Education 13822 4631534.000 335.084 217337260.500 2.131 12.087 -82.369
Entertainment 11042 16555533.000 1499.324 217337260.500 7.617 9.656 -21.110
Finance 8488 34775293.000 4096.995 217337260.500 16.001 7.422 115.571
Food & Drink 3762 24452155.500 6499.776 217337260.500 11.251 3.290 241.998
Games 48027 100793280.500 2098.680 217337260.500 46.376 41.998 10.426
Health & Fitness 667 574591.500 861.457 217337260.500 0.264 0.583 -54.673
Lifestyle 2361 4495269.000 1903.968 217337260.500 2.068 2.065 0.181
Medical 838 225320.000 268.878 217337260.500 0.104 0.733 -85.852
Music 3754 5097658.000 1357.927 217337260.500 2.346 3.283 -28.550
Navigation 96 8622.500 89.818 217337260.500 0.004 0.084 -95.274
News & Magazines 969 1107407.500 1142.835 217337260.500 0.510 0.847 -39.868
Photo & Video 1854 2161889.500 1166.068 217337260.500 0.995 1.621 -38.645
Productivity 1406 920264.500 654.527 217337260.500 0.423 1.229 -65.561
Shopping 570 1544852.000 2710.267 217337260.500 0.711 0.498 42.606
Social Networking 874 1772700.000 2028.261 217337260.500 0.816 0.764 6.721
Sports 1378 4877909.500 3539.847 217337260.500 2.244 1.205 86.256
Stickers 248 10132.500 40.857 217337260.500 0.005 0.217 -97.850
Travel 974 4318900.500 4434.189 217337260.500 1.987 0.852 133.313
Utilities 1841 1848589.000 1004.122 217337260.500 0.851 1.610 -47.166
Weather 60 32385.500 539.758 217337260.500 0.015 0.052 -71.600
In [ ]:
# Google: DataFrame de Categorías y Reseñas
grupos_google_resenas = google.groupby('category').agg({'app_name': 'count', 'rating_count': 'sum', 
                                                        'maximum_installs':'sum'})
grupos_google_resenas['reseñas_por_app'] = grupos_google_resenas['rating_count'] / grupos_google_resenas['app_name']
grupos_google_resenas['reseñas_totales_data'] = 831232521
grupos_google_resenas['porc_reseñas_totales'] = (grupos_google_resenas['rating_count'] / 
                                                grupos_google_resenas['reseñas_totales_data']) * 100
grupos_google_resenas = grupos_google_resenas.sort_index()
grupos_google_resenas['porc_sobre_instalaciones_tot'] = (grupos_google_resenas['maximum_installs'] / 118403380055)*100
grupos_google_resenas['porc_apps_sobre_total'] = (google.category.value_counts(normalize=True)*100).sort_index()
grupos_google_resenas = grupos_google_resenas.rename(columns={'rating_count': 'reseñas_totales_categ', 
                                                             'maximum_installs': 'instalaciones_tot_categ'})
grupos_google_resenas['variacion_porc_reseñas'] = ((grupos_google_resenas['porc_reseñas_totales'] / 
                                                   grupos_google_resenas['porc_apps_sobre_total']) *100) - 100
grupos_google_resenas
Out[ ]:
app_name reseñas_totales_categ instalaciones_tot_categ reseñas_por_app reseñas_totales_data porc_reseñas_totales porc_sobre_instalaciones_tot porc_apps_sobre_total variacion_porc_reseñas
category
Books & Reference 16391 11899178.000 1515123297 725.958 831232521 1.432 1.280 6.185 -76.855
Business 2670 3068321.000 324574121 1149.184 831232521 0.369 0.274 1.007 -63.361
Education 23011 14763967.000 2564137695 641.605 831232521 1.776 2.166 8.683 -79.544
Entertainment 31885 61513179.000 8091627103 1929.220 831232521 7.400 6.834 12.031 -38.491
Finance 4451 19417729.000 896254761 4362.554 831232521 2.336 0.757 1.680 39.090
Food & Drink 1807 13071385.000 610703918 7233.749 831232521 1.573 0.516 0.682 130.631
Games 49445 127611362.000 18892924711 2580.875 831232521 15.352 15.956 18.657 -17.715
Health & Fitness 4930 8476390.000 2176293639 1719.349 831232521 1.020 1.838 1.860 -45.183
Lifestyle 10739 28124858.000 2763350348 2618.946 831232521 3.384 2.334 4.052 -16.501
Medical 1257 1232627.000 125983764 980.610 831232521 0.148 0.106 0.474 -68.736
Music 27957 50909596.000 6148685148 1820.996 831232521 6.125 5.193 10.549 -41.942
Navigation 1262 5217773.000 623132842 4134.527 831232521 0.628 0.526 0.476 31.820
News & Magazines 7068 16007366.000 6902483355 2264.766 831232521 1.926 5.830 2.667 -27.803
Photo & Video 11048 154512332.000 16618360729 13985.548 831232521 18.588 14.035 4.169 345.896
Productivity 4818 14511846.000 1862819705 3012.006 831232521 1.746 1.573 1.818 -3.969
Shopping 2894 46465137.000 2766215125 16055.680 831232521 5.590 2.336 1.092 411.898
Social Networking 5417 48587399.000 4705942853 8969.429 831232521 5.845 3.975 2.044 185.969
Sports 5707 20355674.000 2183141399 3566.791 831232521 2.449 1.844 2.153 13.719
Stickers 4706 40764603.000 13199963087 8662.262 831232521 4.904 11.148 1.776 176.176
Travel 3141 11475297.000 2181078752 3653.390 831232521 1.381 1.842 1.185 16.480
Utilities 43134 124167405.000 22581945311 2878.643 831232521 14.938 19.072 16.276 -8.221
Weather 1280 9079097.000 668638392 7093.045 831232521 1.092 0.565 0.483 126.145

Las estadísticas que vamos a mostrar ahora son sobre el número de reseñas que tienen de media las Categorías.

En general, un gran número de reseñas no está necesariamente asociado a un resultado positivo. Estas estadísticas están íntimamente relacionadas con las estadísticas de valoraciones que venimos mostrando durante todo el Notebook.

Si una Categoría de Apps recibe muchas reseñas e instalaciones, y sus ratings medios son altos, lo catalogaremos como un resultado muy positivo. Si recibe pocas reseñas e instalaciones y sus ratings medios son altos, también lo asumiremos como un resultado positivo, porque el usuario que esté satisfecho con una App no necesariamente va a escribir una reseña o a valorar la App en la tienda.

Por el contrario, si una App recibe muchas reseñas y sus ratings medios son bajos, sí tomaremos los resultados como negativos, y lo mismo para un número pequeño de reseñas: si los ratins medios son bajos, también tomaremos los resultados como negativos.

Hay que tener cuidado a la hora de valorar el número de reseñas de cada Categoría. Existen Categorías (como veremos) que están orientadas hacia un público más joven que es más propenso a escribir reseñas o valorar la App que el público más maduro.

No obstante, vamos a mostrar las estadísticas que hemos recabado:

Categorías - Número de Reseñas Medias por App

In [ ]:
apple_res_por_app = grupos_apple_resenas['reseñas_por_app'].sort_values(ascending=False)
apple_res_por_app
Out[ ]:
primary_genre
Food & Drink        6499.776
Travel              4434.189
Finance             4096.995
Sports              3539.847
Shopping            2710.267
Games               2098.680
Social Networking   2028.261
Lifestyle           1903.968
Entertainment       1499.324
Music               1357.927
Photo & Video       1166.068
News & Magazines    1142.835
Books & Reference   1032.094
Utilities           1004.122
Health & Fitness     861.457
Productivity         654.527
Weather              539.758
Business             471.487
Education            335.084
Medical              268.878
Navigation            89.818
Stickers              40.857
Name: reseñas_por_app, dtype: float64
In [ ]:
google_res_por_app = grupos_google_resenas['reseñas_por_app'].sort_values(ascending=False)
google_res_por_app
Out[ ]:
category
Shopping            16055.680
Photo & Video       13985.548
Social Networking    8969.429
Stickers             8662.262
Food & Drink         7233.749
Weather              7093.045
Finance              4362.554
Navigation           4134.527
Travel               3653.390
Sports               3566.791
Productivity         3012.006
Utilities            2878.643
Lifestyle            2618.946
Games                2580.875
News & Magazines     2264.766
Entertainment        1929.220
Music                1820.996
Health & Fitness     1719.349
Business             1149.184
Medical               980.610
Books & Reference     725.958
Education             641.605
Name: reseñas_por_app, dtype: float64
In [ ]:
# Hacemos dos subplots y destacamos las Categorías de Apps con más reseñas medias
apple_res_por_app['color'] = np.where(apple_res_por_app > 4000, '#FFBC1F', 'blue')
google_res_por_app['color'] = np.where(google_res_por_app > 8000, '#FFBC1F', 'green')
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))

# Dos traces
fig.append_trace(go.Bar(x = apple_res_por_app.index, 
                y = apple_res_por_app, 
                marker_color = apple_res_por_app['color'], 
                name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = google_res_por_app.index, 
                y = google_res_por_app, 
                marker_color = google_res_por_app['color'], 
                name = 'Google Play'), row=2, col=1)

# Configuramos los ejes
fig.update_xaxes(row=1, col=1, tickangle=-45)
fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)

# Título y tamaño
fig.update_layout(showlegend=False,
                  title_text="Categorías: Número de reseñas medias por App",
                  height=1000, width=800)
fig.show()

Mejores Categorías - Porcentaje Reseñas sobre el total Vs Porcentaje Apps sobre el total

Las mejores Categorías según las valoraciones de los usuarios fueron:

  • Libros y Referencia
  • Finanzas
  • Médico
  • Negocios
  • Shopping

Vamos a ver el número de reseñas recibidas por estas Categorías respecto del porcentaje que representan sobre el total:

In [ ]:
apple_porc_resenas = grupos_apple_resenas.loc[['Books & Reference', 'Finance', 'Medical', 'Business', 'Shopping'], 
                         ['porc_apps_sobre_total', 'porc_reseñas_totales', 
                          'variacion_porc_reseñas']].sort_values(by='variacion_porc_reseñas', ascending=False)
apple_porc_resenas
Out[ ]:
porc_apps_sobre_total porc_reseñas_totales variacion_porc_reseñas
primary_genre
Finance 7.422 16.001 115.571
Shopping 0.498 0.711 42.606
Books & Reference 2.797 1.519 -45.694
Business 7.106 1.763 -75.192
Medical 0.733 0.104 -85.852
In [ ]:
google_porc_resenas = grupos_google_resenas.loc[['Books & Reference', 'Finance', 'Medical', 'Business', 'Shopping'], 
                         ['porc_apps_sobre_total', 'porc_reseñas_totales', 
                          'variacion_porc_reseñas']].sort_values(by='variacion_porc_reseñas', ascending=False)
google_porc_resenas
Out[ ]:
porc_apps_sobre_total porc_reseñas_totales variacion_porc_reseñas
category
Shopping 1.092 5.590 411.898
Finance 1.680 2.336 39.090
Business 1.007 0.369 -63.361
Medical 0.474 0.148 -68.736
Books & Reference 6.185 1.432 -76.855
In [ ]:
# Hacemos dos subplots
fig = make_subplots(rows=2, cols=1, subplot_titles=('App Store', 'Google Play'))

# Dos traces
fig.append_trace(go.Bar(x = apple_porc_resenas.index, 
                y = apple_porc_resenas['variacion_porc_reseñas'], 
                marker_color = 'blue', 
                name = 'App Store'), row=1, col=1)
fig.append_trace(go.Bar(x = google_porc_resenas.index, 
                y = google_porc_resenas['variacion_porc_reseñas'], 
                marker_color = 'green', 
                name = 'Google Play'), row=2, col=1)

# Configuramos los ejes
#fig.update_xaxes(row=1, col=1, tickangle=-45)
#fig.update_xaxes(row=2, col=1, tickangle=-45)
fig.update_yaxes(row=1, col=1)
fig.update_yaxes(row=2, col=1)

# Título y tamaño
fig.update_layout(showlegend=False,
                  title_text="TOP Categorías: Reseñas<br><sup>Porcentaje de Reseñas recibidas respecto del número de Apps sobre el total",
                  height=1000, width=800)
fig.show()

Vemos claramente que la Categoría Shopping es la que más reseñas recibe de los usuarios en relación al porcentaje de Apps de Shopping que existen sobre el total, seguido de Finance.

Medical sería la que menos interés genera a la hora de escribir valoraciones, seguida de Business y Books & Reference.

2. Desarrolladores

Ya que disponemos de datos sobre desarrolladores de Apps, vamos a intentar obtener información sobre los mismos.

Veremos los desarrolladores mejor y peor valorados por los usuarios, y después veremos las Categorías de Apps de estos grupos de desarrolladores, para comprobar si alguna empresa de desarrollo de Apps está valorada por encima de la media, y averiguar qué tipo de Apps desarrolla.

In [ ]:
# APPLE: Los 25 desarrolladores de las mejores Categorías mejor valorados 
# con más de 5 Apps en el mercado y más de 500 valoraciones medias por App
mejores_categorias = ['Books & Reference', 'Finance', 'Medical', 'Business', 'Shopping']
apple_por_desarroladores = apple.groupby(['developer', 'primary_genre']).agg({'app_name': 'count', 
                                                                              'total_number_of_ratings': 'mean',
                                                                              'total_average_rating': 'mean'})
# Sacamos 'primary_genre' del index para poder filtrar (está en level=1)
apple_por_desarroladores = apple_por_desarroladores.reset_index(level=1)
apple_top_desarrolladores = apple_por_desarroladores[(apple_por_desarroladores.app_name > 5) & 
                         (apple_por_desarroladores.total_number_of_ratings > 500) &
                        (apple_por_desarroladores.primary_genre.isin(mejores_categorias))].sort_values(by='total_average_rating', 
                                                                                             ascending=False).head(25)
apple_top_desarrolladores
Out[ ]:
primary_genre app_name total_number_of_ratings total_average_rating
developer
Albertsons Companies, LLC Shopping 6 5472.667 4.750
Allan Dziwornu Books & Reference 25 1096.480 4.740
Nordea Bank Finance 8 547.375 4.562
Higher Learning Technologies Medical 57 902.596 4.561
Pocket Prep, Inc. Medical 35 1453.843 4.557
EVOLLY.APP Books & Reference 12 7642.417 4.542
Tatsiana Shukalovich Books & Reference 13 1485.692 4.538
ChuChu Train Productions Finance 7 3344.857 4.429
MobiSystems, Inc. Books & Reference 10 1129.750 4.250
Woodsign Books & Reference 12 790.333 4.250
Synchrony Financial Finance 6 10315.500 4.250
3D4Medical.com, LLC Medical 7 1871.714 4.214
iThinkdiff Books & Reference 28 607.250 4.107
Clint Bagwell Consulting Books & Reference 6 6547.833 3.917
Bank of America Finance 7 257503.143 3.857
AT&T Services, Inc. Business 10 569.300 3.750
Emirates NBD Bank P.J.S.C Finance 6 1181.333 3.583
The Charles Schwab Corporation Finance 6 47417.333 3.583
Ministry Centered Technologies Business 6 553.833 3.583
Michael Quach Books & Reference 57 1176.754 3.447
Al Rajhi Banking and Investment Corporation Finance 7 6725.143 3.429
Webster Bank® Finance 6 1447.500 3.417
HSBC Global Services (UK) Limited Finance 11 981.455 3.318
PNC Bank, N.A. Finance 8 77401.375 3.312
MochaSoft Business 7 11821.714 3.071
In [ ]:
# Creamos un gráfico de dispersión
fig = px.scatter(apple_top_desarrolladores, 
          x = apple_top_desarrolladores.index, 
          y = 'total_average_rating', 
          size = 'app_name', 
          color = 'primary_genre')
fig.update_xaxes(tickangle=-45, title='Desarrollador')
fig.update_yaxes(title='Puntuación Media')

fig.update_layout(showlegend=True,
                  title_text="App Store - Top Categorías: Desarrolladores<br><sup>Número de Apps y Valoraciones Medias por Desarrollador y tipo de App",
                  height=700, width=900)
fig.show()
In [ ]:
# GOOGLE: Los 25 desarrolladores de las mejores Categorías mejor valorados 
# con más de 5 Apps en el mercado y más de 300 valoraciones medias por App
mejores_categorias = ['Books & Reference', 'Finance', 'Medical', 'Business', 'Shopping']
google_por_desarroladores = google.groupby(['developer_id', 'category']).agg({'app_name': 'count', 
                                                                              'rating_count': 'mean',
                                                                              'rating': 'mean'})
# Sacamos 'category' del index para poder filtrar (está en level=1)
google_por_desarroladores = google_por_desarroladores.reset_index(level=1)
google_top_desarrolladores = google_por_desarroladores[(google_por_desarroladores.app_name > 5) & 
                         (google_por_desarroladores.rating_count > 500) &
                        (google_por_desarroladores.category.isin(mejores_categorias))].sort_values(by='rating', 
                                                                                             ascending=False).head(25)
google_top_desarrolladores
Out[ ]:
category app_name rating_count rating
developer_id
Modra Jagoda Medical 6 1941.833 4.800
Mecca Media Books & Reference 6 712.167 4.767
Aleluiah Apps Books & Reference 6 53341.667 4.750
Androazeri (Nural İsmayilov) Books & Reference 6 1205.833 4.750
Bibles free Books & Reference 9 3381.222 4.722
Barokah Studio Books & Reference 6 3118.500 4.717
Doa Istri Saya Books & Reference 32 1556.656 4.709
BIBLE Free Books & Reference 6 1112.833 4.700
Study Bible Books & Reference 13 3119.846 4.700
Salisa Books & Reference 7 1092.429 4.700
Quotes & Messages Books & Reference 11 1124.182 4.691
BIBLIA Books & Reference 6 1657.667 4.683
bible app Books & Reference 7 824.286 4.657
Bibel Books & Reference 8 3201.375 4.650
TheDailyBible.NET Books & Reference 14 2124.571 4.650
DushiApps Books & Reference 42 526.452 4.640
Biblias gratis Books & Reference 11 604.000 4.636
andromoapp Books & Reference 13 833.154 4.631
Seconda Variante Books & Reference 7 60675.857 4.629
Islam Kita Books & Reference 11 1212.091 4.627
Watchdis Prayers Books & Reference 39 4675.513 4.626
Milliy Dasturlar Books & Reference 11 1664.909 4.609
Bible ✝️ Books & Reference 11 725.455 4.600
Zavarise Apps Books & Reference 9 6303.778 4.600
EthioApps Books & Reference 8 957.625 4.587
In [ ]:
# Creamos un gráfico de dispersión
fig = px.scatter(google_top_desarrolladores, 
          x = google_top_desarrolladores.index, 
          y = 'rating', 
          size = 'app_name', 
          color = 'category')
fig.update_xaxes(tickangle=-45, title='Desarrollador')
fig.update_yaxes(title='Puntuación Media')

fig.update_layout(showlegend=True,
                  title_text="Google Play - Top Categorías: Desarrolladores<br><sup>Número de Apps y Valoraciones Medias por Desarrollador y tipo de App",
                  height=700, width=900)
fig.show()

Parece que los desarrolladores de Apps de Libros son los mejor valorados en general, y concretamente hay muchísimas Apps que son Biblias, ya sean de una religión u otra.

Las valoraciones medias de este tipo de App en Google Play Store llaman mucho la atención. De los 25 desarrolladores más valorados —que cumplen con los criterios que hemos establecido para filtrar— 24 son desarrolladores de Libros, y al menos la mitad de ellos se dedican en exclusiva a libros de tipo religioso.

La nota media mínima de estos desarrolladores es 4,58 sobre 5, una nota altísima en comparación con la nota media mínima en el dataset de Apple (3,07 sobre 5).

Está claro que una App relacionada con la Biblia o con contenido religioso en general es una App que encaja perfectamente con los requisitos de nuestra empresa, ya que es una App barata y sencilla de desarrollar y de mantener, que puede recibir anuncios perfectamente, y que como estamos viendo recibe unas valoraciones medias espectaculares.

Vamos a profundizar un poco en este tipo de Apps.

3. Analizando las Apps de contenido religioso

Como hemos dicho, una App tipo Biblia o de contenido religioso es una App que se adapta perfectamente a los requisitos que nos impuso la empresa a la hora de realizar el análisis.

Vamos a estudiar un poco más en detalle este tipo de Apps.

Vamos a filtrar todas las Apps de tipo libro que contengan en su nombre la palabra 'Biblia' o derivados:

In [ ]:
# APPLE: Creamos un DataFrame que contenga Apps de tipo religioso
religion = ['Bible', 'Biblia', 'bible', 'biblia', 'Christ', 'christ', 'Coran', 'Corán', 'Koran', 'koran', 'allah', 
           'Allah', 'Alá', 'alá', 'Religion', 'religion', 'Religión', 'religión', 'new testament', 'New Testament', 
           'New testament', 'Nuevo Testamento', 'Nuevo testamento', 'nuevo testamento', 'Gospel', 'gospel', 
           'evangelio', 'Evangelio', 'Evangelios', 'evangelios', 'Jesus', 'Jesús', 'jesus', 'jesús', 
           'Iglesia', 'iglesia', 'Church', 'church', 'Misa', 'misa']

apple_biblias = apple[(apple.app_name.str.contains('|'.join(religion))) & (apple.primary_genre == 'Books & Reference')]
apple_biblias = apple_biblias[['app_name', 'total_average_rating', 'total_number_of_ratings']].reset_index(drop=True)
apple_biblias
Out[ ]:
app_name total_average_rating total_number_of_ratings
0 beautifulBible 4.500 9.000
1 biblia reina valera 1960 4.500 5.000
2 christianaudio 2.500 328.000
3 eBiblia.ro 4.500 26.000
4 Accordance Bible Software 5.000 7458.000
... ... ... ...
407 99 Names of Allah and Muhammad SAW with Meanin... 3.000 10.000
408 Bible Wallpapers: Daily Verses & Devotional Quote 2.500 5.000
409 Christianity Podcasts 5.000 37.000
410 Bible Quiz - Trivia App Game 4.500 345.000
411 Christmas Maps for Minecraft PE - Pocket Edition 3.500 35.000

412 rows × 3 columns

In [ ]:
# GOOGLE: Creamos un DataFrame que contenga Apps de tipo religioso
google_biblias = google[google.app_name.str.contains('|'.join(religion)) & (google.category == 'Books & Reference')]
google_biblias = google_biblias[['app_name', 'rating', 'rating_count', 'maximum_installs']].reset_index(drop=True)
google_biblias
Out[ ]:
app_name rating rating_count maximum_installs
0 Spurgeon Bible commentary 4.700 570.000 20539
1 Systematic Theology - Learn Bible Doctrine 4.300 113.000 31627
2 Super English & Swahili Bible 4.500 177.000 12574
3 Holman Christian Standard Bible CSB Offline Audio 4.000 8.000 2541
4 Biblia para la mujer 4.800 136.000 4950
... ... ... ... ...
1071 Methodist Ndwom: Hymnal app for Methodist Church 4.800 564.000 25003
1072 English - Kikuyu Bible 4.200 67.000 27904
1073 Ilocano Bible with Audio 4.300 228.000 21321
1074 Biblia Sagrada da Mulher 4.200 74.000 15346
1075 Nouveau Testament de la Bible 4.600 20.000 2900

1076 rows × 4 columns

3.1. Apps Religiosas - Ratings medios Vs las demás Apps

In [ ]:
# Apple: Medias de todo el Dataset
apple['total_average_rating'].mean()
Out[ ]:
3.629573437336038
In [ ]:
# Apple: Medias de Apps Religiosas
apple_biblias['total_average_rating'].mean()
Out[ ]:
4.260922330097087
In [ ]:
# Google: Medias de todo el Dataset
google['rating'].mean()
Out[ ]:
4.137023760560564
In [ ]:
# Google: Medias de Apps Religiosas
google_biblias['rating'].mean()
Out[ ]:
4.507620817843867
In [ ]:
# Graficamos los resultados
tiendas = ['App Store', 'Google Play']
ratings_data = [3.6295, 4.137]
ratings_reli = [4.2609, 4.5076]

# Figura de Plotly
fig = go.Figure(data=[
    go.Bar(showlegend=False, name='Apple',text=ratings_data, x=tiendas, y=ratings_data, marker_color=['blue', 'green']),
    go.Bar(name='Libros religiosos',text=ratings_reli, x=tiendas, y=ratings_reli, marker_color='red')
])
fig.update_traces(texttemplate='%{text:.3s}', textposition='outside')
fig.update_layout(barmode='group', 
                  showlegend=True,
                  title="Valoraciones Medias: Apps Religiosas Vs. Resto de Categorías")
fig.update_yaxes(range=[3.2, 4.8])
fig.show()

Las Apps de contenido religioso obtuvieron unos ratings medios muy superiores a los del resto de Categorías en general. Concretamente, en la App Store 0,63 más de rating, y en Google Play 0,37 de rating.

3.2. Apps religiosas: Ratings Vs Resto de Books & Reference

In [ ]:
apple[apple.primary_genre == 'Books & Reference']['total_average_rating'].mean()
Out[ ]:
3.9426383244763987
In [ ]:
google[google.category == 'Books & Reference']['rating'].mean()
Out[ ]:
4.188511988286255
In [ ]:
# Graficamos los resultados
tiendas = ['App Store', 'Google Play']
ratings_data = [3.942, 4.188]
ratings_reli = [4.2609, 4.5076]

# Figura de Plotly
fig = go.Figure(data=[
    go.Bar(showlegend=False, text=ratings_data, x=tiendas, y=ratings_data, marker_color=['blue', 'green']),
    go.Bar(name='Libros religiosos',text=ratings_reli, x=tiendas, y=ratings_reli, marker_color='red')
])
fig.update_traces(texttemplate='%{text:.3s}', textposition='outside')
fig.update_layout(barmode='group', 
                  showlegend=True,
                  title="Valoraciones Medias: Apps Religiosas Vs. Resto de Apps de Libros")
fig.update_yaxes(range=[3.7, 4.7])
fig.show()

Al igual que al compararlas con el resto de Categorías, si las comparamos con Books & Reference, las Apps de contenido religioso obtuvieron unos ratings medios muy superiores a éstos. Recordemos que Books & Reference fue una de las Categorías mejor valoradas de todos nuestros datos.

3.3. Apps religiosas: ratings Vs Mejores Categorías

Como ya tenemos localizadas las mejores Categorías de Apps, vamos a comparar los ratings medios de las Apps religiosas Vs los ratings medios de las mejores Categorías. Estas Categorías eran:

Categorías con mejor valoración media entre ambas tiendas:

  • Libros y Referencia
  • Finanzas
  • Médico
  • Negocios
  • Shopping

Como ya hemos comparado las Apps religiosas con el resto de 'Books & Reference', vamos a compararlas con las otras cuatro.

In [ ]:
# APPLE
print('APPLE:')
print(f"- Rating Medio Finance: {apple[apple.primary_genre == 'Finance']['total_average_rating'].mean()}")
print(f"- Rating Medio Medical: {apple[apple.primary_genre == 'Medical']['total_average_rating'].mean()}")
print(f"- Rating Medio Business: {apple[apple.primary_genre == 'Business']['total_average_rating'].mean()}")
print(f"- Rating Medio Shopping: {apple[apple.primary_genre == 'Shopping']['total_average_rating'].mean()}")
APPLE:
- Rating Medio Finance: 4.013077285579642
- Rating Medio Medical: 3.818615751789976
- Rating Medio Business: 3.841865616539503
- Rating Medio Shopping: 3.836842105263158
In [ ]:
# GOOGLE
print('GOOGLE:')
print(f"- Rating Medio Finance: {google[google.category == 'Finance']['rating'].mean()}")
print(f"- Rating Medio Medical: {google[google.category == 'Medical']['rating'].mean()}")
print(f"- Rating Medio Business: {google[google.category == 'Business']['rating'].mean()}")
print(f"- Rating Medio Shopping: {google[google.category == 'Shopping']['rating'].mean()}")
GOOGLE:
- Rating Medio Finance: 4.103729498988991
- Rating Medio Medical: 4.285759745425616
- Rating Medio Business: 4.195805243445693
- Rating Medio Shopping: 4.178749136143745
In [ ]:
# Generamos el Gráfico
fig = go.Figure()
fig.add_trace(go.Bar(name='Finance', x=['App Store', 'Google Play'], y=[4.013, 4.103], 
                     legendrank=1, marker_color='blue'))
fig.add_trace(go.Bar(name='Medical', x=['App Store', 'Google Play'], y=[3.818, 4.285], 
                     legendrank=2, marker_color='orange'))
fig.add_trace(go.Bar(name='Business', x=['App Store', 'Google Play'], y=[3.841, 4.195], 
                     legendrank=3, marker_color='black'))
fig.add_trace(go.Bar(name='Shopping', x=['App Store', 'Google Play'], y=[3.836, 4.178], 
                     legendrank=4, marker_color='green'))
fig.add_trace(go.Bar(name='Apps Religiosas', x=['App Store', 'Google Play'], y=[4.260, 4.507], 
                     legendrank=5, marker_color='red'))
fig.update_yaxes(range=[3.6, 4.6])
fig.update_layout(title="Valoraciones Medias: Apps Religiosas Vs. Las Mejores Apps")
fig.show()

Lo mismo ocurre al comparar las Apps de contenido religioso con el resto de Categorías TOP. Los ratings medios son superiores de forma clara.

3.4. Público al que van dirigidas las Apps religiosas

Nuestra intuición nos dice que este tipo de Apps son aptas para todos los públicos, pero no obstante vamos a corroborarlo:

In [ ]:
# DataFrames
apple_religion = apple[(apple.app_name.str.contains('|'.join(religion))) & (apple.primary_genre == 'Books & Reference')]
google_religion = google[google.app_name.str.contains('|'.join(religion)) & (google.category == 'Books & Reference')]

# Apple: Público
apple_religion.age_rating.value_counts()
Out[ ]:
4+     388
9+      10
12+      7
17+      7
Name: age_rating, dtype: int64
In [ ]:
# Filtramos las edades sospechosas para encontrar Apps extrañas
apple_religion[apple_religion.age_rating.isin(['17+', '12+'])]
Out[ ]:
app_name developer age_rating total_average_rating total_number_of_ratings release_date last_update price primary_genre all_genres languages
6 christianaudio christianaudio 12+ 2.500 328.000 2015-05 2018-09 0.000 Books & Reference ['Books', 'Entertainment'] ['EN']
127 Agatha Christie Book Collection Ashaq Rather 12+ 2.500 5.000 2014-03 2016-02 0.000 Books & Reference ['Books'] ['EN']
128 Agatha Christie Reading List Carolyn Lea 12+ 5.000 24.000 2015-09 2017-11 0.000 Books & Reference ['Books', 'Reference'] ['EN']
454 Bible from eBible.com with NIV NKJV KJV ESV NL... Osprit Inc. 17+ 4.500 2753.000 2011-11 2016-05 0.000 Books & Reference ['Reference', 'Books'] ['EN']
467 Bible One Year Teofilo Vizcaino 17+ 4.000 56.000 2011-12 2019-04 0.000 Books & Reference ['Books', 'Reference'] ['EN', 'FR', 'DE', 'IT', 'PT', 'ES']
485 Bible Verses & Sermons Audio by Topic for Prayer GOODBREW, LLC 12+ 4.500 65.000 2015-10 2017-08 0.000 Books & Reference ['Books'] ['EN']
1423 Holy Bible Mobile Teofilo Vizcaino 17+ 4.000 241.000 2012-05 2019-11 0.000 Books & Reference ['Books', 'Lifestyle'] ['EN']
1573 It's the Bible Andrei Marante 12+ 5.000 35.000 2016-12 2018-06 0.000 Books & Reference ['Books', 'Reference'] ['EN']
2588 Santa Biblia Reina Teofilo Vizcaino 17+ 4.000 345.000 2012-03 2019-07 0.000 Books & Reference ['Books', 'Lifestyle'] ['ES']
2842 Storyside Church Storyside Church 17+ 5.000 7.000 2017-02 2018-10 0.000 Books & Reference ['Books'] ['EN']
19228 Bible Memory by MemLok AgileBuilders 17+ 3.500 65.000 2015-09 2019-11 0.000 Books & Reference ['Reference', 'Education'] ['EN']
26676 Let the Bible Speak Matt Tison 17+ 5.000 12.000 2018-09 2018-09 0.000 Books & Reference ['Reference', 'Education'] ['NL', 'EN', 'FR', 'DE', 'IT']
41499 Bible Wallpapers: Daily Verses & Devotional Quote Ankit Mistri 12+ 2.500 5.000 2017-06 2017-06 0.000 Books & Reference ['Reference', 'Entertainment'] ['EN']
96418 Christmas Maps for Minecraft PE - Pocket Edition Nadeem Mughal 12+ 3.500 35.000 2016-12 2017-01 0.000 Books & Reference ['Reference', 'Games'] ['EN']

Vemos que a la hora de realizar el filtrado en la lista de palabras religiosas que creamos anteriormente, se han colado algunas Apps que nada tienen que ver con la religión, pero la cantidad es mínima, y por los ratings que observamos, vemos que en caso de que pudiesen influir en los ratings medios, si eliminásemos estas Apps extrañas, seguramente los ratings de las Apps religiosas serían hasta mayores de lo que ya son. Por tanto concluimos que el age rating dependerá de cada desarrollador, o incluso de la legislación vigente en algún país concreto (dejamos el dato en el aire porque no lo conocemos, son solo hipótesis).

In [ ]:
# Google: Público
google_religion.age.value_counts()
Out[ ]:
Everyone        966
Everyone 10+     55
Mature 17+       30
Teen             25
Name: age, dtype: int64
In [ ]:
google_religion[google_religion.age.isin(['Mature 17+', 'Teen'])].head(10)
Out[ ]:
app_name category rating rating_count installs minimum_installs maximum_installs free price currency size developer_id released last_updated age ad_supported in_app_purchases subcategory
9116 Biblia Sagrada Gratis em Portugues Books & Reference 4.900 21.000 1000.000 1000.000 2580 True 0.000 USD 25M Biblias Religión Espiritualidad AppsBiblia Nov-2018 Mar-2021 Teen True False Books & Reference
12486 Biblia Linguagem Atual / Biblia Sagrada Books & Reference 4.600 745.000 100000.000 100000.000 192703 True 0.000 USD 8.5M Marquez Apps Easy Oct-2018 Jan-2021 Teen True False Books & Reference
15237 Biblia Reina Valera 1960 Books & Reference 4.800 490.000 50000.000 50000.000 98210 True 0.000 USD 16M Estudios Bíblicos Temas Libros Biblia CrisTeol... Jan-2018 Jun-2021 Mature 17+ True False Books & Reference
21877 Dictionnaire de la Bible Books & Reference 4.300 5106.000 500000.000 500000.000 564400 True 0.000 USD 23M Edson Deda Jan-2015 Apr-2021 Mature 17+ True False Books & Reference
26550 Preguntas y Respuestas de la Biblia Books & Reference 4.400 72.000 10000.000 10000.000 28982 True 0.000 USD 18M Biblia Estudios Temas Cristianos Libro BigCris... Jun-2019 Jun-2021 Mature 17+ True False Books & Reference
31637 Jewish Complete Bible Books & Reference 4.600 690.000 10000.000 10000.000 20961 True 0.000 USD 13M Bible ✝️ May-2017 Jun-2021 Teen True False Books & Reference
39473 Santa Biblia Reina Valera completa gratis Books & Reference 4.600 94.000 10000.000 10000.000 35708 True 0.000 USD 9.1M Apps Dinwidi Sep-2018 May-2021 Mature 17+ True False Books & Reference
50444 Daniel Bible Prophecy Books & Reference 4.800 52.000 5000.000 5000.000 6940 True 0.000 USD 7.1M Biblia Estudios Temas Cristianos Libro BigCris... Nov-2019 Mar-2021 Mature 17+ True False Books & Reference
59166 Christian Devotionals Books & Reference 4.600 335.000 10000.000 10000.000 49441 True 0.000 USD 9.8M Estudos Bíblicos Livros Libros MevesApps Jul-2017 May-2021 Mature 17+ True False Books & Reference
64769 Holy Bible in Audio Books & Reference 4.700 9168.000 500000.000 500000.000 551250 True 0.000 USD 24M Castelo Apps Jan-2017 Apr-2021 Teen True False Books & Reference

Al igual que en Apple, concluimos que las edades nada tienen que ver con la presencia de Apps extrañas —que no pertenezcan al subgénero religioso—.

4. Fechas

Vamos a ver ahora qué cantidad de Apps actualizadas existen en cada DataFrame.

Cada dataset fue recopilado en épocas distintas:

  • El dataset de Apple fue construido en febrero de 2020
  • El dataset de Google fue construido en Junio de 2021

Vamos a establecer criterios para determinar si una App está actualizada o no. Consideraremos una App actualizada si recibió alguna actualización en el último año, y consideraremos que una App está en desuso si la última actualización recibida fue anterior a este periodo.

Vamos a filtrar las Apps en ambos DataFrames:

In [ ]:
# APPLE: Apps religiosas totales en el dataset
len(apple_religion.index)
Out[ ]:
412
In [ ]:
# APPLE: Apps cuya última actualización fue en 2019 o 2020
apple_religion_actualizadas = apple_religion[(apple_religion.last_update.str.contains('2019')) | 
               (apple_religion.last_update.str.contains('2020'))]
len(apple_religion_actualizadas.index)
Out[ ]:
162
In [ ]:
# GOOGLE: Apps religiosas totales en el dataset
len(google_religion.index)
Out[ ]:
1076

Los datos de Google fueron recabados en el mes de Junio, por lo que si incluimos tanto 2020 como 2021, estaríamos abarcando un periodo de tiempo de 18 meses, lo que es excesivo.

Vamos a crear una lista con 12 strings, que serán todas las fechas válidas para nosotros.

In [ ]:
# GOOGLE: Apps cuya última actualización fue recibida en el periodo de los últimos 14 meses
meses = ['Jun-2020', 'Jul-2020', 'Aug-2020', 'Sep-2020', 'Oct-2020', 
        'Dec-2020', 'Jan-2021', 'Feb-2021', 'Mar-2021', 'Apr-2021', 'May-2021', 'Jun-2021']
google_religion_actualizadas = google_religion[google_religion.last_updated.isin(meses)]
len(google_religion_actualizadas.index)
Out[ ]:
850

Tenemos 162 Apps de carácter religioso en la App Store, y 850 en la Play Store.

Esto significa que tenemos poco más de 1000 Apps que recibieron alguna actualización en algún momento de los doce meses anteriores a la construcción de los datasets.

Podríamos filtrar más para comprobar cuáles están realmente actualizadas y cuáles no, pero 1000 Apps es un número suficientemente pequeño comparado con las casi 400,000 Apps de las que partíamos (aproximadamente el 0,25% de las Apps totales).

Esto quiere decir que si creamos una App competitiva (aunque destinemos un presupuesto relativamente bajo a su desarollo), es posible obtener beneficios de ella, y en su defecto, tampoco supondría una gran pérdida.

Lo que está claro es que las Apps con una temática religiosa son una excelente opción si queremos desarrollar una App barata, que permita publicidad y que pueda ser lanzada en cualquier mercado.

5. Conclusiones

Hemos analizado los datos que tenemos desde varias perspectivas.

Vimos las Apps mejor y peor valoradas por los usuarios, tanto en valores absolutos como el valor esperado. La Categoría Books & Reference siempre estuvo entre las mejor valoradas, y encajaba perfectamente con el tipo de App que nuestra empresa quiere desarrollar, pero no teníamos ninguna conclusión clara.

Analizamos los desarrolladores de Apps para poder tomarlos como referencia, y nos dimos cuenta de que los mejor valorados se dedicaban a desarrollar Apps tipo libro o audiolibro, y más concretamente de contenido religioso.

Profundizamos un poco más en este subgénero, y nos dimos cuenta de que las valoraciones medias que obtienen este tipo de Apps son superiores a todas las demás Categorías, con márgenes bastante fuertes.

Este tipo de App cumple todos los requisitos que nos impuso nuestra empresa:

  • Es una App barata de desarrollar y mantener
  • Se puede nutrir de publicidad
  • Puede ser lanzada en cualquier mercado e idioma

Además, cuenta con otras ventajas adicionales, como:

  • Es un tipo de App flexible: el contenido religioso puede contener solo texto, audio y texto, e incluso vídeo o streaming (por ejemplo, eventos religiosos, noticias, etc.).
  • Podemos actualizar la App de forma periódica, o incluso automatizar eventos diarios relacionados con la religión como frases, pasajes de la Biblia, etc.
  • Otro aspecto flexible que ofrece este tipo de App, es que al existir multitud de religiones alrededor del mundo, podemos enfocar cada App en las religiones mayoritarias en cada región. Para esto harían falta estudios adicionales, que no nos competen, pero son ideas que incorporamos al proyecto.
  • Podemos empezar con el castellano y el inglés, y en función del éxito obtenido con la App, plantearnos agregar idiomas adicionales en el futuro.
  • Este tipo de App abarca todas las edades, desde niños hasta ancianos, y todas las clases socio-económicas, desde las clases más bajas a las más altas, por lo que no existe un target específico.
  • La religión es atemporal, lo que quiere decir que una App que tenga éxito en este mercado nunca estará desfasada, porque el contenido religioso es algo que no evoluciona.